From f664e3c9114f1b58b24421c459674778c4b6af57 Mon Sep 17 00:00:00 2001
From: tsteven4 <13596209+tsteven4@users.noreply.github.com>
Date: Wed, 15 Mar 2023 06:12:51 -0600
Subject: [PATCH] support millisecond track moves (#1036)
* support millisecond track moves
* add another position to track move option.
---
reference/track/trackfilter-move-z.gpx | 22 ++++++++++++++++++++++
testo.d/track.test | 3 +++
trackfilter.cc | 17 ++++++++++-------
xmldoc/filters/options/track-move.xml | 2 +-
4 files changed, 36 insertions(+), 8 deletions(-)
create mode 100644 reference/track/trackfilter-move-z.gpx
diff --git a/reference/track/trackfilter-move-z.gpx b/reference/track/trackfilter-move-z.gpx
new file mode 100644
index 000000000..3698b1f7b
--- /dev/null
+++ b/reference/track/trackfilter-move-z.gpx
@@ -0,0 +1,22 @@
+
+
+
+
+
+ LOG-20020527
+
+
+ 0.000
+
+
+
+ 0.000
+
+
+
+ 0.000
+
+
+
+
+
diff --git a/testo.d/track.test b/testo.d/track.test
index cc1de5874..adb9afbe1 100644
--- a/testo.d/track.test
+++ b/testo.d/track.test
@@ -54,6 +54,9 @@ compare ${REFERENCE}/track/trackfilter-move-d.gpx ${TMPDIR}/trackfilter-move-d.g
gpsbabel -t -i gpx -f ${REFERENCE}/track/trackfilter.gpx -x track,move=-5m,name=LOG-20020527,start=20020527185742,stop=20020527185950,minimum_points=2 -o gpx -F ${TMPDIR}/trackfilter-move-m.gpx
compare ${REFERENCE}/track/trackfilter-move-m.gpx ${TMPDIR}/trackfilter-move-m.gpx
+gpsbabel -t -i gpx -f ${REFERENCE}/track/trackfilter.gpx -x track,move=5z,name=LOG-20020527,start=20020527190141.5,stop=20020527190449.5,minimum_points=2 -o gpx -F ${TMPDIR}/trackfilter-move-z.gpx
+compare ${REFERENCE}/track/trackfilter-move-z.gpx ${TMPDIR}/trackfilter-move-z.gpx
+
# actually test a merge
gpsbabel -t -i gpx -f ${REFERENCE}/track/trackfilter_merge.gpx -x track,merge -x track,speed -o gpx -F ${TMPDIR}/trackfilter_merge~gpx.gpx
compare ${REFERENCE}/track/trackfilter_merge~gpx.gpx ${TMPDIR}/trackfilter_merge~gpx.gpx
diff --git a/trackfilter.cc b/trackfilter.cc
index f63b1359c..a690a6c79 100644
--- a/trackfilter.cc
+++ b/trackfilter.cc
@@ -75,7 +75,7 @@ qint64 TrackFilter::trackfilter_parse_time_opt(const char* arg)
{
qint64 result = 0;
- static const QRegularExpression re(R"(^([+-]?\d+)([wdhms])(?:([+-]?\d+)([wdhms]))?(?:([+-]?\d+)([wdhms]))?(?:([+-]?\d+)([wdhms]))?(?:([+-]?\d+)([wdhms]))?$)", QRegularExpression::CaseInsensitiveOption);
+ static const QRegularExpression re(R"(^([+-]?\d+)([wdhmsz])(?:([+-]?\d+)([wdhmsz]))?(?:([+-]?\d+)([wdhmsz]))?(?:([+-]?\d+)([wdhmsz]))?(?:([+-]?\d+)([wdhmsz]))?(?:([+-]?\d+)([wdhmsz]))?$)", QRegularExpression::CaseInsensitiveOption);
assert(re.isValid());
QRegularExpressionMatch match = re.match(arg);
if (match.hasMatch()) {
@@ -89,18 +89,21 @@ qint64 TrackFilter::trackfilter_parse_time_opt(const char* arg)
switch (match.captured(idx+1).at(0).toLower().toLatin1()) {
case 'w':
- partial *= SECONDS_PER_DAY * 7;
+ partial *= SECONDS_PER_DAY * 1000 * 7;
break;
case 'd':
- partial *= SECONDS_PER_DAY;
+ partial *= SECONDS_PER_DAY * 1000;
break;
case 'h':
- partial *= SECONDS_PER_HOUR;
+ partial *= SECONDS_PER_HOUR * 1000;
break;
case 'm':
- partial *= 60;
+ partial *= 60 * 1000;
break;
case 's':
+ partial *= 1000;
+ break;
+ case 'z':
break;
default:
fatal(MYNAME "-time: invalid unit in move option \"%s\"!\n", qPrintable(match.captured(idx+1)));
@@ -110,7 +113,7 @@ qint64 TrackFilter::trackfilter_parse_time_opt(const char* arg)
}
#ifdef TRACKF_DBG
- qDebug() << MYNAME "-time option: shift =" << result << "seconds";
+ qDebug() << MYNAME "-time option: shift =" << result / 1000.0 << "seconds";
#endif
} else {
fatal(MYNAME "-time: invalid value in move option \"%s\"!\n", arg);
@@ -579,7 +582,7 @@ void TrackFilter::trackfilter_move()
for (auto* track : qAsConst(track_list)) {
foreach (Waypoint* wpt, track->waypoint_list) {
if (wpt->creation_time.isValid()) {
- wpt->creation_time = wpt->creation_time.addSecs(delta);
+ wpt->creation_time = wpt->creation_time.addMSecs(delta);
} else {
++timeless_points;
}
diff --git a/xmldoc/filters/options/track-move.xml b/xmldoc/filters/options/track-move.xml
index c7a09cb84..8ce1248ce 100644
--- a/xmldoc/filters/options/track-move.xml
+++ b/xmldoc/filters/options/track-move.xml
@@ -8,7 +8,7 @@ It can also be useful to correct tracks for week number roll over problems.
The value of this option is a series of integer and unit pairs. Each integer may include a
leading '+' or '-' sign. Positive integers shift the tracks later, while negative integers shift
the tracks earlier. If no sign is provided the integer is assumed to be nonnegative.
-Possible units are w for weeks, d for days, h for hours, m for minutes and s for seconds.
+Possible units are w for weeks, d for days, h for hours, m for minutes, s for seconds and z for milliseconds.
Time-shifting a track with the track filter
--
2.30.2